Mineração de Dados 6
Os tópicos abordados serão:
análise temporal e espacial de dados: gráficos de séries temporais, médias móveis, criação de mapas em geral e mapas cloropléticos;
pacote
plotlypara análise gráfica;criação de dashboards e tabelas interativas;
criação de aplicativos interativos por meio do pacote
shiny.
Vamos instalar os pacotes necessários.
install.packages("plotly") # pacote para análise gráfica
install.packages("leaflet") # pacote para criação de mapas
install.packages("rgdal") # pacote para importação de dados geoespaciais
install.packages("DT") # pacote para criação de tabelas interativas
install.packages("flexdashboard") # pacote para criação de dashboards
install.packages("shiny") # pacote para criaçao de aplicativos interativosVamos utilizar também os pacotes stringr, ggplot2 e magrittr, mas estes foram instalados anteriormente.
Exemplo 11 - COVID-19 no estado do Rio de Janeiro
O banco de dados corresponde ao número de casos de COVID-19 no período de fevereiro de 2020 a dezembro de 2020, juntamente com outras variáveis, para os municípios do Rio de Janeiro.
Os dados forma acessados em https://brasil.io/dataset/covid19/boletim/ em 21 de dezembro de 2020.
Fonte: Secretarias de Saúde das Unidades Federativas, dados tratados por Álvaro Justen e equipe de voluntários Brasil.IO (Brasil.IO 2020).
Uma pré-filtragem foi feita de forma a reduzir a base de dados para municípios do estado do Rio de Janeiro e remover variáveis que não são de interesse nesta análise.
As variáveis:
- city - cidade;
- city_ibge_code - código da cidade;
- date - data;
- epidemiological_week - semana epidemiológica;
- estimated_population - população estimada;
- estimated_population_2019 - população estimada em 2019;
- last_available_confirmed - casos acumulados;
- last_available_confirmed_per_100k_inhabitants - taxa acumulada de casos por 100 mil habitantes;
- last_available_death_rate - taxa acumulada de óbitos;
- last_available_deaths - número acumulado de óbitos;
- new_confirmed - novos casos;
- new_deaths - novos óbitos.
Importando o banco de dados
Arquivo com extensão .csv
Vamos importar a base de dados.
dados <- read.csv("http://im.ufrj.br/~joao/cienciadedados/covid2.csv")
head(dados) # vislumbre dos dados
names(dados) # # nomes das colunas do objeto (variáveis)
attach(dados)## city city_ibge_code date epidemiological_week
## 1 Barra Mansa 3300407 2020-03-05 10
## 2 Barra Mansa 3300407 2020-03-06 10
## 3 Rio de Janeiro 3304557 2020-03-06 10
## 4 Barra Mansa 3300407 2020-03-07 10
## 5 Rio de Janeiro 3304557 2020-03-07 10
## 6 Barra Mansa 3300407 2020-03-08 11
## estimated_population estimated_population_2019 last_available_confirmed
## 1 184833 184412 1
## 2 184833 184412 1
## 3 6747815 6718903 1
## 4 184833 184412 1
## 5 6747815 6718903 1
## 6 184833 184412 1
## last_available_confirmed_per_100k_inhabitants last_available_date
## 1 0.54103 2020-03-05
## 2 0.54103 2020-03-06
## 3 0.01482 2020-03-06
## 4 0.54103 2020-03-06
## 5 0.01482 2020-03-06
## 6 0.54103 2020-03-08
## last_available_death_rate last_available_deaths new_confirmed new_deaths
## 1 0 0 1 0
## 2 0 0 0 0
## 3 0 0 1 0
## 4 0 0 0 0
## 5 0 0 0 0
## 6 0 0 0 0
## [1] "city"
## [2] "city_ibge_code"
## [3] "date"
## [4] "epidemiological_week"
## [5] "estimated_population"
## [6] "estimated_population_2019"
## [7] "last_available_confirmed"
## [8] "last_available_confirmed_per_100k_inhabitants"
## [9] "last_available_date"
## [10] "last_available_death_rate"
## [11] "last_available_deaths"
## [12] "new_confirmed"
## [13] "new_deaths"
Na base de dados originais, para evitar problemas com a codificação das palavras com acentos, podemos utitizar a opção encoding=“UTF-8”
Análise dos dados no tempo
- Vamos inicialmente analisar como os dado se comportam ao longo do tempo.
Análise exloratória do número de novos casos
Antes de começar a análise, vamos verificar se as observações estão ordenadas no tempo de forma correta.
Para este fim, vamos utilizar o pacote stringr (Wickham 2019), que nos permitirá extrair os meses e dias das datas.
library("stringr")
mes <- str_sub(date,6,7) # posições 6 e 7 correspondem ao mês
dia <- str_sub(date,9,10) # posições 6 e 7 correspondem ao diaAgora plotamos os dados em sequência utilizando o gráfico para série temporal do pacote base do R.
Podemos perceber que não há indícios de que os dados estejam desordenados no tempo.
Vamos agora investigar o número de casos novos no estado.
aux <- aggregate(new_confirmed,by=list(date),FUN="sum") # agregando o total de casos por data
data <- aux[,1] # data
casos <- aux[,2] # casosplot(casos,type="l",lwd=2,col="darkblue",axes=FALSE,ylab="Novos casos",xlab="Tempo",main="Estado do Rio de Janeiro")
ticks <- seq(0,300,by=50)
axis(1,at=ticks,labels=data[ticks+1],cex.lab=0.5)
axis(2) Vamos olhar o número de casos somente do município do Rio de Janeiro.
plot(casosrio,type="l",lwd=2,col="red",axes=FALSE,ylab="Novos casos",xlab="Tempo",main="Município do Rio de Janeiro")
axis(1,at=ticks,labels=datario[ticks+1],cex.lab=0.5)
axis(2) Podemos investigar outros municípios, como Petrópolis, por exemplo.
plot(casospet,type="l",lwd=2,col="darkolivegreen2",axes=FALSE,ylab="Novos casos",xlab="Tempo",main="Petrópolis")
axis(1,at=ticks,labels=datapet[ticks+1],cex.lab=0.5)
axis(2) Vamos refazer os gráficos utilizando o pacote
ggplot2 (Wickham 2016)
ggplot(aux,aes(x=as.Date(aux[,1]),y=aux[,2])) + geom_line(size=1,col="blue") +
labs(x="Tempo",y="Novos casos",title="Estado do Rio de Janeiro")ggplot(data.frame(datario,casosrio),aes(x=as.Date(datario),y=casosrio)) + geom_line(size=1,col="red") +
labs(x="Tempo",y="Novos casos",title="Município do Rio de Janeiro")ggplot(data.frame(datapet,casospet),aes(x=as.Date(datapet),y=casospet)) + geom_line(size=1,col="darkolivegreen2") +
labs(x="Tempo",y="Novos casos",title="Petrópolis")Média móvel
A média móvel é uma medida que busca suavizar o gráfico de uma série temporal ao retirar parte do efeito da variabilidade.
Este processo torna mais fácil a visualização de tendências no tempo.
A média móvel em um determinado instante de tempo \(t\) é dada pela média das observações nos tempos vizinhos.
A escolha do número de tempos vizinhos pode variar. Quanto maior este número, mais suave é a série temporal das médias móveis; quanto menor, menos suave.
Para os casos de COVID-19, é comum considerar que a média móvel em um determinado dia é a média do dia e mais seis dias passados, ou seja, é a media de sete dias.
Vamos construir uma função para calcular a média móvel de uma série temporal.
mm <- function(serie,dias){
lag <- dias - 1
aux <- c(rep(NA,l=lag),serie[(lag+1):length(serie)]) # primeiras posições vazias
for(i in (lag+1):length(aux)){
aux[i] <- mean(serie[(i-lag):i])
}
return(aux)
}Vamos plotar o número de casos e a média móvel para o estado do Rio de Janeiro.
suav <- mm(casos,7)
df <- data.frame("data"=as.Date(data),"casos"=casos,"suav"=suav)
ggplot(df,aes(x=data,y=casos)) + geom_line(col="blue") +
labs(x="Tempo",y="Novos casos",title="Estado do Rio de Janeiro") +
geom_line(aes(data,suav),size=1,col="red")## Warning: Removed 6 row(s) containing missing values (geom_path).
Vamos utilizar uma outra representação do número de casos.
suav <- mm(casos,7)
df <- data.frame("data"=as.Date(data),"casos"=casos,"suav"=suav)
ggplot(df) + geom_bar(aes(x=data,weight=casos),col="cyan3",fill="cyan3") +
labs(x="Tempo",y="Novos casos",title="Estado do Rio de Janeiro") +
geom_line(aes(data,suav),size=1,col="red") + theme_bw()## Warning: Removed 6 row(s) containing missing values (geom_path).
Vamos calcular as médias móveis dos municípios do Rio de Janeiro e de Petrópolis.
suavrio <- mm(casosrio,7)
suavpet <- mm(casospet,7)
dfrio <- data.frame("data"=as.Date(datario),"casos"=casosrio,"suavrio"=suavrio)
dfpet <- data.frame("data"=as.Date(datapet),"casos"=casospet,"suavrio"=suavpet)
ggplot(dfrio) + geom_bar(aes(x=data,weight=casos),col="coral",fill="coral") +
geom_line(aes(x=data,y=suavrio),size=1,col="blue") +
labs(x="Tempo",y="Novos casos",title="Município do Rio de Janeiro")## Warning: Removed 6 row(s) containing missing values (geom_path).
ggplot(dfpet) + geom_bar(aes(x=data,weight=casos),col="darkolivegreen3",fill="darkolivegreen3") +
geom_line(aes(x=data,y=suavrio),size=1,col="black") +
labs(x="Tempo",y="Novos casos",title="Petrópolis")## Warning: Removed 6 row(s) containing missing values (geom_path).
Pacote plotly
O pacote
plotly(Sievert 2020) oferece uma grande variedade de ferramentas gráficas e de visualização de dados.Ele permite, por exemplo, a confecção de gráficos interativos. Uma galeria com exemplos básicos pode ser vista em https://plotly.com/r/.
Análise exloratória do número de novos casos
Primeiramente, instalaremos o pacote plotly e, em seguida, iremos chamá-lo.
##
## Attaching package: 'plotly'
## The following object is masked from 'package:ggplot2':
##
## last_plot
## The following object is masked from 'package:stats':
##
## filter
## The following object is masked from 'package:graphics':
##
## layout
Vamos plotar o total de casos no estado do Rio de Janeiro usando a função plot_ly() do pacote plotly.
## Warning: `arrange_()` is deprecated as of dplyr 0.7.0.
## Please use `arrange()` instead.
## See vignette('programming') for more help
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_warnings()` to see where this warning was generated.
Para editarmos os nomes dos eixos, por exemplo, precisamos do operador pipe e utilizar a função layout(). Vamos chamar o pacote magrittr.
x <- list(title="Tempo")
y <- list(title="Novos casos")
p <- plot_ly(x=as.Date(data),y=casos,type="scatter",mode="lines",title="Novos casos") %>% layout(xaxis=x,yaxis=y,title="Estado do Rio de Janeiro")
p## Warning: 'scatter' objects don't have these attributes: 'title'
## Valid attributes include:
## 'type', 'visible', 'showlegend', 'legendgroup', 'opacity', 'name', 'uid', 'ids', 'customdata', 'meta', 'selectedpoints', 'hoverinfo', 'hoverlabel', 'stream', 'transforms', 'uirevision', 'x', 'x0', 'dx', 'y', 'y0', 'dy', 'stackgroup', 'orientation', 'groupnorm', 'stackgaps', 'text', 'texttemplate', 'hovertext', 'mode', 'hoveron', 'hovertemplate', 'line', 'connectgaps', 'cliponaxis', 'fill', 'fillcolor', 'marker', 'selected', 'unselected', 'textposition', 'textfont', 'r', 't', 'error_x', 'error_y', 'xcalendar', 'ycalendar', 'xaxis', 'yaxis', 'idssrc', 'customdatasrc', 'metasrc', 'hoverinfosrc', 'xsrc', 'ysrc', 'textsrc', 'texttemplatesrc', 'hovertextsrc', 'hovertemplatesrc', 'textpositionsrc', 'rsrc', 'tsrc', 'key', 'set', 'frame', 'transforms', '_isNestedKey', '_isSimpleKey', '_isGraticule', '_bbox'
Vamos agora adicionar a série temporal da média móvel.
p <- plot_ly(x=as.Date(data),y=casos,type="scatter",mode="lines",name="Novos casos") %>% layout(xaxis=x,yaxis=y,title="Estado do Rio de Janeiro")
p <- p %>% add_trace(y=suav,type="scatter",mode="lines",name="Média móvel")
pAgora faremos um gráfico utilizando barras para o número de casos.
p <- plot_ly(x=as.Date(data),y=casos,type="bar",name="Novos casos") %>% layout(xaxis=x,yaxis=y,title="Estado do Rio de Janeiro")
p <- p %>% add_trace(y=suav,type="scatter",mode="lines",name="Média móvel")
pVamos agora fazer os gráficos para os municípios do Rio de Janeiro e Petrópolis.
Pacote leaflet
O pacote
leaflet(Cheng, Karambelkar, e Xie 2019) permite a integração de mapas em JavaScript no R.Ele fornece grande variedade de opções e flexibilidade para se trabalhar com mapas.
Exemplos (utilização do pacote leaflet)
Vamos instalar e chamar o pacote.
Como primeiro passo, vamos incluir um mapa com a localização do Centro de Tecnologia da UFRJ.
ct <- leaflet() # inicializa o mapa
ct <- addTiles(ct) # adiciona uma camada ao mapa
ct <- addMarkers(ct,lat=-22.85809187293725,lng=-43.23112677625925,popup="Centro de Tecnologia da UFRJ") # adiciona um marcador ao mapa
ct # plota o mapaA função addTiles() acrescenta uma camada padrão do OpenStreetMap (https://www.openstreetmap.org/#map=4/-15.13/-53.19). Entreanto, camadas de outra fonte podem ser utilizadas por meio da função addProviderTiles().
Vamos verificas as fontes disponíveis.
## [1] "OpenStreetMap"
## [2] "OpenStreetMap.Mapnik"
## [3] "OpenStreetMap.DE"
## [4] "OpenStreetMap.CH"
## [5] "OpenStreetMap.France"
## [6] "OpenStreetMap.HOT"
## [7] "OpenStreetMap.BZH"
## [8] "OpenSeaMap"
## [9] "OpenPtMap"
## [10] "OpenTopoMap"
## [11] "OpenRailwayMap"
## [12] "OpenFireMap"
## [13] "SafeCast"
## [14] "Thunderforest"
## [15] "Thunderforest.OpenCycleMap"
## [16] "Thunderforest.Transport"
## [17] "Thunderforest.TransportDark"
## [18] "Thunderforest.SpinalMap"
## [19] "Thunderforest.Landscape"
## [20] "Thunderforest.Outdoors"
## [21] "Thunderforest.Pioneer"
## [22] "Thunderforest.MobileAtlas"
## [23] "Thunderforest.Neighbourhood"
## [24] "OpenMapSurfer"
## [25] "OpenMapSurfer.Roads"
## [26] "OpenMapSurfer.Hybrid"
## [27] "OpenMapSurfer.AdminBounds"
## [28] "OpenMapSurfer.ContourLines"
## [29] "OpenMapSurfer.Hillshade"
## [30] "OpenMapSurfer.ElementsAtRisk"
## [31] "Hydda"
## [32] "Hydda.Full"
## [33] "Hydda.Base"
## [34] "Hydda.RoadsAndLabels"
## [35] "MapBox"
## [36] "Stamen"
## [37] "Stamen.Toner"
## [38] "Stamen.TonerBackground"
## [39] "Stamen.TonerHybrid"
## [40] "Stamen.TonerLines"
## [41] "Stamen.TonerLabels"
## [42] "Stamen.TonerLite"
## [43] "Stamen.Watercolor"
## [44] "Stamen.Terrain"
## [45] "Stamen.TerrainBackground"
## [46] "Stamen.TerrainLabels"
## [47] "Stamen.TopOSMRelief"
## [48] "Stamen.TopOSMFeatures"
## [49] "TomTom"
## [50] "TomTom.Basic"
## [51] "TomTom.Hybrid"
## [52] "TomTom.Labels"
## [53] "Esri"
## [54] "Esri.WorldStreetMap"
## [55] "Esri.DeLorme"
## [56] "Esri.WorldTopoMap"
## [57] "Esri.WorldImagery"
## [58] "Esri.WorldTerrain"
## [59] "Esri.WorldShadedRelief"
## [60] "Esri.WorldPhysical"
## [61] "Esri.OceanBasemap"
## [62] "Esri.NatGeoWorldMap"
## [63] "Esri.WorldGrayCanvas"
## [64] "OpenWeatherMap"
## [65] "OpenWeatherMap.Clouds"
## [66] "OpenWeatherMap.CloudsClassic"
## [67] "OpenWeatherMap.Precipitation"
## [68] "OpenWeatherMap.PrecipitationClassic"
## [69] "OpenWeatherMap.Rain"
## [70] "OpenWeatherMap.RainClassic"
## [71] "OpenWeatherMap.Pressure"
## [72] "OpenWeatherMap.PressureContour"
## [73] "OpenWeatherMap.Wind"
## [74] "OpenWeatherMap.Temperature"
## [75] "OpenWeatherMap.Snow"
## [76] "HERE"
## [77] "HERE.normalDay"
## [78] "HERE.normalDayCustom"
## [79] "HERE.normalDayGrey"
## [80] "HERE.normalDayMobile"
## [81] "HERE.normalDayGreyMobile"
## [82] "HERE.normalDayTransit"
## [83] "HERE.normalDayTransitMobile"
## [84] "HERE.normalDayTraffic"
## [85] "HERE.normalNight"
## [86] "HERE.normalNightMobile"
## [87] "HERE.normalNightGrey"
## [88] "HERE.normalNightGreyMobile"
## [89] "HERE.normalNightTransit"
## [90] "HERE.normalNightTransitMobile"
## [91] "HERE.reducedDay"
## [92] "HERE.reducedNight"
## [93] "HERE.basicMap"
## [94] "HERE.mapLabels"
## [95] "HERE.trafficFlow"
## [96] "HERE.carnavDayGrey"
## [97] "HERE.hybridDay"
## [98] "HERE.hybridDayMobile"
## [99] "HERE.hybridDayTransit"
## [100] "HERE.hybridDayGrey"
## [101] "HERE.hybridDayTraffic"
## [102] "HERE.pedestrianDay"
## [103] "HERE.pedestrianNight"
## [104] "HERE.satelliteDay"
## [105] "HERE.terrainDay"
## [106] "HERE.terrainDayMobile"
## [107] "FreeMapSK"
## [108] "MtbMap"
## [109] "CartoDB"
## [110] "CartoDB.Positron"
## [111] "CartoDB.PositronNoLabels"
## [112] "CartoDB.PositronOnlyLabels"
## [113] "CartoDB.DarkMatter"
## [114] "CartoDB.DarkMatterNoLabels"
## [115] "CartoDB.DarkMatterOnlyLabels"
## [116] "CartoDB.Voyager"
## [117] "CartoDB.VoyagerNoLabels"
## [118] "CartoDB.VoyagerOnlyLabels"
## [119] "CartoDB.VoyagerLabelsUnder"
## [120] "HikeBike"
## [121] "HikeBike.HikeBike"
## [122] "HikeBike.HillShading"
## [123] "BasemapAT"
## [124] "BasemapAT.basemap"
## [125] "BasemapAT.grau"
## [126] "BasemapAT.overlay"
## [127] "BasemapAT.highdpi"
## [128] "BasemapAT.orthofoto"
## [129] "nlmaps"
## [130] "nlmaps.standaard"
## [131] "nlmaps.pastel"
## [132] "nlmaps.grijs"
## [133] "nlmaps.luchtfoto"
## [134] "NASAGIBS"
## [135] "NASAGIBS.ModisTerraTrueColorCR"
## [136] "NASAGIBS.ModisTerraBands367CR"
## [137] "NASAGIBS.ViirsEarthAtNight2012"
## [138] "NASAGIBS.ModisTerraLSTDay"
## [139] "NASAGIBS.ModisTerraSnowCover"
## [140] "NASAGIBS.ModisTerraAOD"
## [141] "NASAGIBS.ModisTerraChlorophyll"
## [142] "NLS"
## [143] "JusticeMap"
## [144] "JusticeMap.income"
## [145] "JusticeMap.americanIndian"
## [146] "JusticeMap.asian"
## [147] "JusticeMap.black"
## [148] "JusticeMap.hispanic"
## [149] "JusticeMap.multi"
## [150] "JusticeMap.nonWhite"
## [151] "JusticeMap.white"
## [152] "JusticeMap.plurality"
## [153] "Wikimedia"
## [154] "GeoportailFrance"
## [155] "GeoportailFrance.parcels"
## [156] "GeoportailFrance.ignMaps"
## [157] "GeoportailFrance.maps"
## [158] "GeoportailFrance.orthos"
## [159] "OneMapSG"
## [160] "OneMapSG.Default"
## [161] "OneMapSG.Night"
## [162] "OneMapSG.Original"
## [163] "OneMapSG.Grey"
## [164] "OneMapSG.LandLot"
ct <- leaflet() # inicializa o mapa
ct <- addProviderTiles(ct,providers$Esri.WorldPhysical) # adiciona uma camada ao mapa
ct <- addMarkers(ct,lat=-22.85809187293725,lng=-43.23112677625925,popup="Centro de Tecnologia da UFRJ") # adiciona um marcador ao mapa
ct # plota o mapaVamos refazer o mapa anterior acrescentando algumas opções.
fig <- makeIcon("C:/Users/joaob/OneDrive/Desktop/Dados/godzilla.png",
iconWidth = 100, iconHeight = 130) # criando um ícone a partir de uma figuratexto <- "<b>Centro de Tecnologia</b><br/>Av. Athos da Silveira Ramos, 149<br/>Cidada Universitária" # texto em HTML
ct <- leaflet() # inicializa o mapa
ct <- addTiles(ct) # adiciona uma camada ao mapa
ct <- addMarkers(ct,lat=-22.85809187293725,lng=-43.23112677625925,popup=texto,icon=fig) # adiciona um marcador ao mapa
ct # plota o mapaTalvez o encadeamento das funções fique mais intuitivo se utilizarmos o operador pipe. Vamos repetir os comandos anteriores.
ct <- leaflet() %>% addTiles() %>% addMarkers(ct,lat=-22.85809187293725,lng=-43.23112677625925,popup=texto,icon=fig)
ctUm guia para utilização do leaflet no R pode ser visto em https://rstudio.github.io/leaflet/.
Lendo arquivos de dados geoespaciais
Shapefile é, provavelmente, o formato mais popular de arquivo com dados geoespaciais.
Os dados são representados por pontos (localizações, por exemplo), linhas (rios ou ruas, por exemplo) e polígonos (cidade, bairro, por exemplo).
Um shapefile, na verdade é composto por vários arquivos.
Outro formato popular de arquivo de dados geoespaciais é geoJSON, que representa os recursos de forma análoga ao shapefile: pontos, linhas e polígonos.
O pacote rgdal permite que os dados nestes dois formatos sejam lidos e interpretados como mapas no R. Portanto, vamos instalá-lo.
Análise dos dados no espaço
- Vamos agora analisar como os dado se comportam ao longo do estado do Rio de Janeiro.
Mapa do estado do Rio de Janeiro
Vamos, inicialmente, ler os dados geoespaciais do estado do Rio de Janeiro e ver as como podemos trabalhar com seu mapa.
## Loading required package: sp
## rgdal: version: 1.5-18, (SVN revision 1082)
## Geospatial Data Abstraction Library extensions to R successfully loaded
## Loaded GDAL runtime: GDAL 3.0.4, released 2020/01/28
## Path to GDAL shared files: C:/Program Files/R/R-3.6.3/library/rgdal/gdal
## GDAL binary built with GEOS: TRUE
## Loaded PROJ runtime: Rel. 6.3.1, February 10th, 2020, [PJ_VERSION: 631]
## Path to PROJ shared files: C:/Program Files/R/R-3.6.3/library/rgdal/proj
## Linking to sp version:1.4-4
## To mute warnings of possible GDAL/OSR exportToProj4() degradation,
## use options("rgdal_show_exportToProj4_warnings"="none") before loading rgdal.
## OGR data source with driver: GeoJSON
## Source: "C:\Users\joaob\OneDrive\Desktop\Dados\rio.json", layer: "rio"
## with 92 features
## It has 3 fields
Vamos plotar o mapa de forma simples e ver algumas de suas características.
## [1] "id" "name" "description"
## [1] Angra dos Reis Aperibé Araruama
## [4] Areal Armação dos Búzios Arraial do Cabo
## 92 Levels: Angra dos Reis Aperibé Araruama Areal ... Volta Redonda
O mapa do estado do Rio de Janeiro e outros mapas estão disponíveis em https://github.com/tbrugz/geodata-br.
Vamos agora utilizar o leaflet para produzir mapas mais sofisticados.
Vamos modificar algumas opções.
lmapa <- leaflet(mapa) %>% addPolygons(weight=1,color="black",fillColor="yellow",label=~name,highlightOptions = highlightOptions(color="white",weight=3,
bringToFront = TRUE)) %>% addCircles(lat=-22.85809187293725,lng=-43.23112677625925,radius=8000,col="red",label="Ilha do Fundão")
lmapaAnálise exloratória da taxa de casos acumulados
Vamos ver como se comportam as taxas de casos acumulados por 100 mil habitantes ao longo do estado do Rio de Janeiro na última data do banco de dados, que é 20 de dezembro de 2020.
## [1] 2020-12-20
## 291 Levels: 2020-03-05 2020-03-06 2020-03-07 2020-03-08 ... 2020-12-20
acdez <- last_available_confirmed_per_100k_inhabitants[date==dez] # taxa acumulada na última dada
head(acdez)## [1] 3662.990 1999.832 1591.297 2462.704 3193.433 1075.409
cidez <- city[date==dez] # municípios na última data
iddez <- city_ibge_code[date==dez] # códigos dos municíos na última dataQueremos incluir a informação da taxa no mapa. Para isto, podemos utilizar a função merge(). O identidicador comum será o código do município.
Vamos aproveitar e colocar os nomes sem problema de codificação no mapa.
## taxa id cidade
## 1 3662.990 3300100 Angra dos Reis
## 2 1999.832 3300159 Aperibé
## 3 1591.297 3300209 Araruama
## 4 2462.704 3300225 Areal
## 5 3193.433 3300233 Armação dos Búzios
## 6 1075.409 3300258 Arraial do Cabo
## [1] "id" "name" "description" "taxa" "cidade"
Agora vamos fazer um mapa cloroplético em que as cores das cidades correspondem à sua taxa.
# cores por quantis
cores <- colorQuantile(heat.colors(10),NULL) # palheta que será utilizada
lmapa1 <- leaflet(mapanew) %>% addPolygons(weight=0.5,color="black",label=~paste0(cidade,": ",round(taxa,2)),fillColor=~cores(taxa),smoothFactor=0.5,opacity=0.8, fillOpacity=0.5,highlightOptions=highlightOptions(color="white",weight=5,bringToFront=TRUE)) %>% addLegend(pal=cores,values=~taxa,opacity=0.5)
lmapa1# cores por valor
cores <- colorNumeric("magma",NULL) # palheta do pacote viridisLite
lmapa2 <- leaflet(mapanew) %>% addPolygons(weight=0.5,color="black",label=~paste0(cidade,": ",round(taxa,2)),fillColor=~cores(log(taxa)),smoothFactor=0.5,opacity=0.8, fillOpacity=0.5,highlightOptions=highlightOptions(color="white",weight=5,bringToFront=TRUE)) %>% addLegend(pal=cores,values=~log(taxa),opacity=0.5)
lmapa2Vamos comparar com o mapa de 20 de dezembro com o de 31 de outubro.
## [1] "2020-10-31"
## [1] 3019.1650 1722.5443 1323.9707 2186.4393 1673.5795 768.1496
## taxaout id
## 1 3019.1650 3300100
## 2 1722.5443 3300159
## 3 1323.9707 3300209
## 4 2186.4393 3300225
## 5 1673.5795 3300233
## 6 768.1496 3300258
## [1] "id" "name" "description" "taxa" "cidade"
## [6] "taxaout"
# cores por quantis
cores <- colorQuantile(heat.colors(10),NULL) # palheta que será utilizada
lmapa3 <- leaflet(mapanew2) %>% addPolygons(weight=0.5,color="black",label=~paste0(cidade,": ",round(taxaout,2)),fillColor=~cores(taxaout),smoothFactor=0.5,opacity=0.8, fillOpacity=0.5,highlightOptions=highlightOptions(color="white",weight=5,bringToFront=TRUE)) %>% addLegend(pal=cores,values=~taxaout,opacity=0.5)
lmapa3# cores por valor
cores <- colorNumeric("magma",NULL) # palheta do pacote viridisLite
lmapa4 <- leaflet(mapanew2) %>% addPolygons(weight=0.5,color="black",label=~paste0(cidade,": ",round(taxaout,2)),fillColor=~cores(log(taxaout)),smoothFactor=0.5,opacity=0.8, fillOpacity=0.5,highlightOptions=highlightOptions(color="white",weight=5,bringToFront=TRUE)) %>% addLegend(pal=cores,values=~log(taxaout),opacity=0.5)
lmapa4Pacote DT
- O pacote
DT(Xie, Cheng, e Tan 2020) permite a integração de tabelas da biblioteca DataTables do JavaScrit no R.
Número de casos em uma tabela dinâmica
Vamos instalar e chamar o pacote.
Vamos fazer um tabela com o número de casos e número de casos acumulados de 1 de outubro até 21 de dezembro.
mes <- str_sub(date,6,7) # criando uma coluna de mês
dados2 <- dados[((mes=="10")|(mes=="11")|(mes=="12")),] # considerando somente os meses 10, 11 e 12
head(dados2)## city city_ibge_code date epidemiological_week
## 16007 Angra dos Reis 3300100 2020-10-01 40
## 16008 Aperibé 3300159 2020-10-01 40
## 16009 Araruama 3300209 2020-10-01 40
## 16010 Areal 3300225 2020-10-01 40
## 16011 Armação dos Búzios 3300233 2020-10-01 40
## 16012 Arraial do Cabo 3300258 2020-10-01 40
## estimated_population estimated_population_2019 last_available_confirmed
## 16007 207044 203785 5567
## 16008 11901 11759 189
## 16009 134293 132400 1510
## 16010 12669 12572 219
## 16011 34477 33870 463
## 16012 30593 30349 185
## last_available_confirmed_per_100k_inhabitants last_available_date
## 16007 2688.8005 2020-10-01
## 16008 1588.1018 2020-10-01
## 16009 1124.4071 2020-10-01
## 16010 1728.6289 2020-10-01
## 16011 1342.9243 2020-10-01
## 16012 604.7135 2020-10-01
## last_available_death_rate last_available_deaths new_confirmed new_deaths
## 16007 0.0334 186 51 3
## 16008 0.0370 7 1 0
## 16009 0.0430 65 35 0
## 16010 0.0365 8 0 0
## 16011 0.0302 14 1 1
## 16012 0.0324 6 0 0
Dashboards
Dashboards são ótimas ferramentas de visualização de dados.
Eles podem comunicar uma grande variedade de informação de forma prática e, por vezes, interativa.
Dashboards podem ser feitos de forma fácil no R Markdown por meio do pacote
flexdashboard.
Exemplos de dashboards
Vamos instalar e chamar o pacote flexdashboard (Iannone, Allaire, e Borges 2020) e, em seguida, faremos alguns exemplos.
No primeiro exemplo construímos um dashboard com algumas análises de bases de dados do pacote base do R. Acesse aqui.
No segundo exemplo contruímos um dashboard com os reultados da análise da COVID-19 no estado do Rio de Janeiro. Acesse aqui.
- Exemplos de dashboards podem ser vistos em https://rmarkdown.rstudio.com/flexdashboard/.
Pacote shiny
O pacote
shiny(Chang et al. 2020) permite a criação de aplicativos interativos.Os aplicativos podem ser criados em uma página HTML independente ou serem incorporados em um documento do R Markdown.
Detalhes sobre o pacote podem ser vistos em https://shiny.rstudio.com/tutorial/written-tutorial/lesson1/.
Uma vez construídos, os aplicativos podem ser rodados localmente ou publicados, com certa limitação de acesso, em https://www.shinyapps.io/.
Referências
Brasil.IO. 2020. Boletins epidemiológicos da COVID-19 por município por dia. http://engineering.purdue.edu/~mark/puthesis.
Chang, W., J. Cheng, J. J. Allaire, Y. Xie, e J. McPherson. 2020. shiny: Web Application Framework for R. https://CRAN.R-project.org/package=shiny.
Cheng, J., B. Karambelkar, e Y. Xie. 2019. leaflet: Create Interactive Web Maps with the JavaScript ’Leaflet’ Library. https://CRAN.R-project.org/package=leaflet.
Iannone, R., J. J. Allaire, e B. Borges. 2020. flexdashboard: R Markdown Format for Flexible Dashboards. https://CRAN.R-project.org/package=flexdashboard.
Sievert, C. 2020. Interactive Web-Based Data Visualization with R, plotly, and shiny. Chapman; Hall/CRC. https://plotly-r.com.
Wickham, H. 2016. ggplot2: Elegant Graphics for Data Analysis. Springer-Verlag New York. https://ggplot2.tidyverse.org.
———. 2019. stringr: Simple, Consistent Wrappers for Common String Operations. https://CRAN.R-project.org/package=stringr.
Xie, Y., J. Cheng, e X. Tan. 2020. DT: A Wrapper of the JavaScript Library ’DataTables’. https://CRAN.R-project.org/package=DT.